別找了,這個命令讓你在字符串和十六進制間自由轉(zhuǎn)換 | 您所在的位置:網(wǎng)站首頁 › 好聽(tīng)的英文名字女孩網(wǎng)(wǎng)名 昵稱 › 別找了,這個命令讓你在字符串和十六進制間自由轉(zhuǎn)換 |
做開發(fā),尤其是嵌入式開發(fā),要不過去過去曾經(jīng),要不現(xiàn)在,或者將來一定會遇到十六進制字符串和二進制文件之間轉(zhuǎn)換的作。 像這樣的情形: 有一個十六進制字符串,需要轉(zhuǎn)換為二進制文件;有一個二進制文件,需要轉(zhuǎn)換為十六進制數(shù)組;有一個十六進制數(shù)組,需要轉(zhuǎn)換為二進制文件;有一個二進制文件,需要轉(zhuǎn)換為十六進制字符串;最多就是前兩種情形。不管你是不是經(jīng)常遇到,反正我是。 以前到處搜,沒找到中意的,后來干脆自己用python寫了個腳本將二進制轉(zhuǎn)數(shù)組。到后來發(fā)現(xiàn),都是浪費時間,linux自帶工具就能滿足這樣的需求,甚至更多。 好吧,廢話不多說了。一句話,命令行工具xxd能讓你實現(xiàn)這種自由。要是覺得太啰嗦,還請直接轉(zhuǎn)到第7節(jié)看總結(jié)。 1. 十六進制字符串轉(zhuǎn)換為二進制文件 例一我有一個十六進制字符串,包含字母數(shù)字大小寫,想轉(zhuǎn)換成二進制文件。 # 字符串: ABCDEF0123456789abcdef0123456789 # 1. 轉(zhuǎn)換 $ echo -n "ABCDEF0123456789abcdef0123456789" | xxd -r -ps > test11.bin # 2. 檢查 $ xxd -g 1 test11.bin 0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89 ....#Eg.....#Eg. 例二例一中的情形太簡單了,上個復(fù)一點的,這次是完整的十六進制字符串,字符帶有0x前綴,還有空格,想轉(zhuǎn)換成二進制文件。 # 字符串: 0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89 # 轉(zhuǎn)換 $ echo -n "0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89" | xxd -r -ps > test12.bin # 檢查 $ xxd test12.bin 0000000: abcd ef01 2345 6789 abcd ef01 2345 6789 ....#Eg.....#Eg. 例三升級版,這次的字符串中不僅有0x前綴,帶空格,還有逗號","分割,一樣不在話下: # 字符串: "0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89" # 轉(zhuǎn)換 $ echo -n "0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89" | xxd -r -ps > test13.bin # 檢查 $ xxd test13.bin 0000000: abcd ef01 2345 6789 abcd ef01 2345 6789 ....#Eg.....#Eg.就一條命令,帶有字母數(shù)字大小寫,帶空格0x前綴和逗號的字符串,通通一行搞定,就問你服不服。 2. 二進制文件轉(zhuǎn)換成十六進制數(shù)組用到這個作的地方實在是太多了,常常需要將各種點陣字庫,各種圖片,各種固件轉(zhuǎn)換成代碼。 So easy! 一秒搞定! 例四把前面例一中的二進制文件轉(zhuǎn)換成數(shù)組。 方式一: # 文件 $ xxd -g 1 test11.bin 0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89 ....#Eg.....#Eg. # 數(shù)組 $ xxd -i test11.bin unsigned char test11_bin[] = { 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89 }; unsigned int test11_bin_len = 16;方式二: # 文件 $ xxd -g 1 test11.bin 0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89 ....#Eg.....#Eg. # 數(shù)組 $ xxd -i < test11.bin 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89這兩種方式有點小差別,看出來區(qū)別在哪里了嗎?不管怎樣,就問你爽不爽? 3. 十六進制數(shù)組轉(zhuǎn)換成二進制文件 例五其實這種方式在例三中已經(jīng)說過了,對頭不? # 從數(shù)組中拿到的字符串 $ echo -n " 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xAB, 0xCD, 0xEF, 0x98, 0x76, 0x54, 0x32, 0x10 " | xxd -r -ps > test31.bin # 檢查文件 $ hexdump -Cv test31.bin 00000000 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 |........"3DUfw..| 00000010 01 23 45 67 89 ab cd ef ab cd ef 98 76 54 32 10 |.#Eg........vT2.| 00000020 4. 二進制文件轉(zhuǎn)換為十六進制字符串 例六我有個二進制文件,想轉(zhuǎn)換成對應(yīng)的字符串。 就是把前面例一中的二進制文件還原成字符串 # 二進制文件 $ xxd -g 1 test11.bin 0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89 ....#Eg.....#Eg. # 轉(zhuǎn)換成小寫字符串 $ xxd -ps test11.bin abcdef0123456789abcdef0123456789 # 轉(zhuǎn)換成大寫字符串 $ xxd -ps -u test11.bin ABCDEF0123456789ABCDEF0123456789 5. 更多騷作,十六進制轉(zhuǎn)二進制位串 例七,查看文件的二進制位串 $ xxd -g 1 test11.bin 0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89 ....#Eg.....#Eg. $ xxd -b test11.bin 0000000: 10101011 11001101 11101111 00000001 00100011 01000101 ....#E 0000006: 01100111 10001001 10101011 11001101 11101111 00000001 g..... 000000c: 00100011 01000101 01100111 10001001 #Eg. $ xxd -g 1 -c 8 test11.bin 0000000: ab cd ef 01 23 45 67 89 ....#Eg. 0000008: ab cd ef 01 23 45 67 89 ....#Eg. rocky@guyongqiangx:/public/xxd$ xxd -b -c 8 test11.bin 0000000: 10101011 11001101 11101111 00000001 00100011 01000101 01100111 10001001 ....#Eg. 0000008: 10101011 11001101 11101111 00000001 00100011 01000101 01100111 10001001 ....#Eg. 6. 不能再爽了,還能直接修改二進制文件 例八,修改二進制文件直接以指定偏移量的方式修改文件,下面這個命令將0x12開始的4個字節(jié)替換為"0xAA 0xBB 0xCC 0xDD": # 修改前 $ xxd test31.bin 0000000: aabb ccdd eeff 0011 2233 4455 6677 8899 ........"3DUfw.. 0000010: 0123 4567 89ab cdef abcd ef98 7654 3210 .#Eg........vT2. # 替換0x12開始的4個字節(jié)為 AA BB CC DD $ echo -n "0012: AABBCCDD" | xxd -r - test31.bin # 修改后 $ xxd test31.bin 0000000: aabb ccdd eeff 0011 2233 4455 6677 8899 ........"3DUfw.. 0000010: 0123 aabb ccdd cdef abcd ef98 7654 3210 .#..........vT2.命令echo -n "0012: AABBCCDD" | xxd -r - test31.bin中有個小小的-,千萬不要漏掉了。 還有,修改前記得要備份!哭的時候,不要說我沒提醒過,哈哈哈~~ 7. 總結(jié) 十六進制字符串轉(zhuǎn)換成二進制文件 $ echo -n "ABCDEF0123456789abcdef0123456789" | xxd -r -ps > test11.bin 二進制文件轉(zhuǎn)換成十六進制數(shù)組 $ xxd -i test11.bin unsigned char test11_bin[] = { 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89 }; unsigned int test11_bin_len = 16; 二進制文件轉(zhuǎn)換成十六進制字符串 $ xxd -ps test11.bin abcdef0123456789abcdef0123456789掌握了這3條命令,十六進制和二進制轉(zhuǎn)化,你自由了。 剩下的時間可用來泡妞,可用來劃水,可用來摸魚,還可以用來解更多的bug,這一切的一切,難道不香嗎? xxd工具,你值得擁有。 最近會重新開始更新公眾號,所以來一波硬廣。 洛奇工作中常常會遇到自己不熟悉的問題,這些問題可能并不難,但因為不了解,找不到人幫忙而瞎折騰,往往導(dǎo)致浪費幾天甚至更久的時間。 所以我組建了幾個微信討論群(記得微信我說加哪個群,如何加微信見后面),歡迎一起討論: 一個密碼編碼學討論組,主要討論各種加解密,簽名校驗等算法,請說明加密碼學討論群。一個Android OTA的討論組,請說明加Android OTA群。一個git和repo的討論組,請說明加git和repo群。在工作之余,洛奇盡量寫一些對大家有用的東西,如果洛奇的這篇文章讓您有所收獲,解決了您一直以來未能解決的問題,不妨贊賞一下洛奇,這也是對洛奇付出的最大鼓勵。掃下面的二維碼贊賞洛奇,金額隨意: 洛奇自己維護了一個公眾號“洛奇看世界”,一個很佛系的公眾號,不定期瞎逼逼。公號也提供個人聯(lián)系方式,一些資源,說不定會有意外的收獲,詳細內(nèi)容見公號提示。掃下方二維碼關(guān)注公眾號: |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實驗室設(shè)備網(wǎng) 版權(quán)所有 |